객체 그래프
객체와 객체 사이의 참조 관계를 나타내는 구조
객체는 노드, 참조는 엣지로 표현할 수 있다
루트 세트(Root Set)
객체 그래프 순회의 시작점
주로 스택의 지역 변수, 정적 변수, 스레드 스택을 포함한다
순회 과정
- 루트 세트에서 시작한다
- 각 객체의 참조를 따라 연결된 모든 객체를 방문한다
- 방문한 객체는 방문 처리한다
예시
public class ObjectGraphExample {
public static void main(String[] args) {
Person person1 = new Person("Alice");
Person person2 = new Person("Bob");
person1.setFriend(person2);
person2.setFriend(person1);
person1 = null; // person1에 대한 직접 참조 제거
}
}
class Person {
private String name;
private Person friend;
public Person(String name) {
this.name = name;
}
public void setFriend(Person friend) {
this.friend = friend;
}
}
초기 상태
- main 메소드의 지역 변수 person1과 person2가 루트 세트이다
- person1은 객체 Alice를 참조하고, person2는 객체 Bob을 참조한다
- Alice와 Bob은 서로를 참조한다
- person1 = null 이후 더 이상 Alice를 직접 참조하지 않게 된다
가비지 컬렉터의 순회
- 루트 세트 person2에서 시작한다
- person2에서 Bob 객체로 이동한다
- Bob 객체에서 Alice 객체로 이동한다
- 모든 객체가 여전히 도달 가능하므로 가비지 컬렉션 대상이 없다